﻿// DigitalDesign
// Project: InformationBoard
// Developer: Montak Oleg
// Created: 13.11.2011
// Last change: 15.11.2011
// Description: interface of ScheduleService - provides all transactions with the schedule

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace Server
{
    [ServiceContract]
    public interface IScheduleService
    {
        #region отдача информации: всевозможные списки

        /// <summary>
        /// Возвращает расписание для клиента на определенные даты, с учетом изменений
        /// </summary>
        [OperationContract]
        ActualScheduleResult GetActualSchedule(int clientId, IEnumerable<DateTime> dates);

        /// <summary>
        /// Возвращает все изменения в расписании для вокзаза на определенный период.
        /// Если date_start и/или date_end == null, соотв. ограничение не учитывается.
        /// </summary>
        [OperationContract]
        ScheduleChangesResult GetChangesSchedule(int stationId, DateTime? dateStart = null, DateTime? dateEnd = null);

        /// <summary>
        /// Возвращает список всех отмененных поездов/самолетов в указанный период.
        /// Если date_start и/или date_end == null, соотв. ограничение не учитывается.
        /// </summary>
        [OperationContract]
        ScheduleChangesResult GetCancelledSchedule(int stationId, DateTime? dateStart = null, DateTime? dateEnd = null);

        /// <summary>
        /// Возвращает список добавленных (в опер. изменения) поездов
        /// </summary>
        [OperationContract]
        ScheduleChangesResult GetAddedSchedule(int stationId, DateTime? dateStart = null, DateTime? dateEnd = null);

        /// <summary>
        /// Возвращает расписание для всего вокзала, по дням недели, без учета изменений
        /// </summary>
        [OperationContract]
        ScheduleResult GetSchedule(int stationId);

        [OperationContract]
        LocationsResult GetLocations(int stationId);

        [OperationContract]
        DaysOfWeekResult GetDaysOfWeek();

        #endregion

        #region внесение изменений

        /// <summary>
        /// Упрощенный доступ к функциональности, предоставляемой addScheduleChanges/deleteScheduleChanges
        /// </summary>
        [OperationContract]
        bool SetCancelledSchedule(int scheduleId, DateTime date, bool canceled);

        /// <summary>
        /// Добавляет изменения в расписание. В случае конфликтов, затирает имеющиеся данные.
        /// в ScheduleChanx вся информация об опер. изменении в т.ч. и shedule_id
        /// </summary>
        [OperationContract]
        bool AddScheduleChange(wScheduleChanxNode sc);

        /// <summary>
        /// Удаляет запись об оперативном изменении.
        /// </summary>
        [OperationContract]
        bool DeleteScheduleChanges(int sheduleChangeId);

        /// <summary>
        /// Удаляет все оперативные изменения за указанный период. null - не учитывать ограничение.
        /// </summary>
        [OperationContract(Name = "DeleteScheduleChangesByDatePeriod")]
        bool DeleteScheduleChanges(DateTime? startDate = null, DateTime? endDate = null);

        /// <summary>
        /// Изменяет существующую запись об оперативном изменении.
        /// </summary>
        [OperationContract]
        bool ReplaceScheduleChanges(int sheduleChangeId, wScheduleChanxNode newChanges);


        
        // работа с обычным расписанием
        [OperationContract]
        bool AddSchedule(wScheduleNode schedule);

        [OperationContract]
        bool DeleteSchedule(int scheduleId);

        [OperationContract]
        bool ReplaceSchedule(int scheduleId, wScheduleNode newSchedule);

        #endregion
    }
}
